తెలుగు

టైప్‌స్క్రిప్ట్ బ్రాండెడ్ రకాలను అన్వేషించండి, ఇది ఒక స్ట్రక్చరల్ టైప్ సిస్టమ్‌లో నామినల్ టైపింగ్ సాధించడానికి ఒక శక్తివంతమైన సాంకేతికత. టైప్ సేఫ్టీ మరియు కోడ్ స్పష్టతను ఎలా మెరుగుపరచాలో తెలుసుకోండి.

టైప్‌స్క్రిప్ట్ బ్రాండెడ్ రకాలు: ఒక స్ట్రక్చరల్ సిస్టమ్‌లో నామినల్ టైపింగ్

టైప్‌స్క్రిప్ట్ యొక్క స్ట్రక్చరల్ టైప్ సిస్టమ్ సౌలభ్యాన్ని అందిస్తుంది కానీ కొన్నిసార్లు ఊహించని ప్రవర్తనకు దారితీయవచ్చు. బ్రాండెడ్ రకాలు నామినల్ టైపింగ్‌ను అమలు చేయడానికి ఒక మార్గాన్ని అందిస్తాయి, టైప్ సేఫ్టీ మరియు కోడ్ స్పష్టతను మెరుగుపరుస్తాయి. ఈ ఆర్టికల్ బ్రాండెడ్ రకాలను వివరంగా అన్వేషిస్తుంది, వాటి అమలు కోసం ఆచరణాత్మక ఉదాహరణలు మరియు ఉత్తమ పద్ధతులను అందిస్తుంది.

స్ట్రక్చరల్ మరియు నామినల్ టైపింగ్ మధ్య వ్యత్యాసాన్ని అర్థం చేసుకోవడం

బ్రాండెడ్ రకాల గురించి తెలుసుకునే ముందు, స్ట్రక్చరల్ మరియు నామినల్ టైపింగ్ మధ్య వ్యత్యాసాన్ని స్పష్టం చేసుకుందాం.

స్ట్రక్చరల్ టైపింగ్ (డక్ టైపింగ్)

ఒక స్ట్రక్చరల్ టైప్ సిస్టమ్‌లో, రెండు రకాలు ఒకే నిర్మాణం (అంటే, ఒకే రకాలతో ఒకే ప్రాపర్టీలు) కలిగి ఉంటే, అవి అనుకూలంగా పరిగణించబడతాయి. టైప్‌స్క్రిప్ట్ స్ట్రక్చరల్ టైపింగ్‌ను ఉపయోగిస్తుంది. ఈ ఉదాహరణను పరిశీలించండి:


interface Point {
  x: number;
  y: number;
}

interface Vector {
  x: number;
  y: number;
}

const point: Point = { x: 10, y: 20 };
const vector: Vector = point; // Valid in TypeScript

console.log(vector.x); // Output: 10

Point మరియు Vector వేర్వేరు రకాలుగా ప్రకటించబడినప్పటికీ, టైప్‌స్క్రిప్ట్ వాటికి ఒకే నిర్మాణం ఉన్నందున Point ఆబ్జెక్ట్‌ను Vector వేరియబుల్‌కు కేటాయించడానికి అనుమతిస్తుంది. ఇది సౌకర్యవంతంగా ఉండవచ్చు, కానీ లాజికల్‌గా వేర్వేరు రకాలు ఒకే ఆకారాన్ని కలిగి ఉన్నప్పుడు మీరు వాటిని వేరు చేయవలసి వస్తే ఇది తప్పులకు దారితీయవచ్చు. ఉదాహరణకు, అక్షాంశం/రేఖాంశం కోసం కోఆర్డినేట్‌లు యాదృచ్ఛికంగా స్క్రీన్ పిక్సెల్ కోఆర్డినేట్‌లతో సరిపోలవచ్చు.

నామినల్ టైపింగ్

ఒక నామినల్ టైప్ సిస్టమ్‌లో, రకాలు ఒకే పేరును కలిగి ఉంటే మాత్రమే అవి అనుకూలంగా పరిగణించబడతాయి. రెండు రకాలు ఒకే నిర్మాణం కలిగి ఉన్నప్పటికీ, వాటికి వేర్వేరు పేర్లు ఉంటే అవి విభిన్నంగా పరిగణించబడతాయి. జావా మరియు C# వంటి భాషలు నామినల్ టైపింగ్‌ను ఉపయోగిస్తాయి.

బ్రాండెడ్ రకాల ఆవశ్యకత

మీరు ఒక విలువ దాని నిర్మాణం తో సంబంధం లేకుండా ఒక నిర్దిష్ట రకానికి చెందినదని నిర్ధారించుకోవలసిన అవసరం వచ్చినప్పుడు టైప్‌స్క్రిప్ట్ యొక్క స్ట్రక్చరల్ టైపింగ్ సమస్యాత్మకం కావచ్చు. ఉదాహరణకు, కరెన్సీలను సూచించడాన్ని పరిగణించండి. మీకు USD మరియు EUR కోసం వేర్వేరు రకాలు ఉండవచ్చు, కానీ అవి రెండూ సంఖ్యలుగా సూచించబడవచ్చు. వాటిని వేరు చేయడానికి ఒక యంత్రాంగం లేకుండా, మీరు అనుకోకుండా తప్పు కరెన్సీపై కార్యకలాపాలను నిర్వహించవచ్చు.

బ్రాండెడ్ రకాలు ఈ సమస్యను పరిష్కరిస్తాయి, దీనివల్ల మీరు నిర్మాణాత్మకంగా సారూప్యంగా ఉండే కానీ టైప్ సిస్టమ్ ద్వారా విభిన్నంగా పరిగణించబడే విభిన్న రకాలను సృష్టించవచ్చు. ఇది టైప్ సేఫ్టీని మెరుగుపరుస్తుంది మరియు లేకపోతే జారిపోయే తప్పులను నివారిస్తుంది.

టైప్‌స్క్రిప్ట్‌లో బ్రాండెడ్ రకాలను అమలు చేయడం

బ్రాండెడ్ రకాలు ఇంటర్‌సెక్షన్ రకాలు మరియు ఒక ప్రత్యేకమైన సింబల్ లేదా స్ట్రింగ్ లిటరల్ ఉపయోగించి అమలు చేయబడతాయి. దీని వెనుక ఉన్న ఆలోచన ఒక రకానికి "బ్రాండ్" జోడించడం, అది ఒకే నిర్మాణం ఉన్న ఇతర రకాల నుండి దానిని వేరు చేస్తుంది.

సింబల్స్‌ను ఉపయోగించడం (సిఫార్సు చేయబడింది)

బ్రాండింగ్ కోసం సింబల్స్‌ను ఉపయోగించడం సాధారణంగా ప్రాధాన్యత ఇవ్వబడుతుంది ఎందుకంటే సింబల్స్ ప్రత్యేకంగా ఉంటాయని హామీ ఇవ్వబడింది.


const USD = Symbol('USD');
type USD = number & { readonly [USD]: unique symbol };

const EUR = Symbol('EUR');
type EUR = number & { readonly [EUR]: unique symbol };

function createUSD(value: number): USD {
  return value as USD;
}

function createEUR(value: number): EUR {
  return value as EUR;
}

function addUSD(a: USD, b: USD): USD {
  return (a + b) as USD;
}

const usd1 = createUSD(10);
const usd2 = createUSD(20);
const eur1 = createEUR(15);

const totalUSD = addUSD(usd1, usd2);
console.log("Total USD:", totalUSD);

// Uncommenting the next line will cause a type error
// const invalidOperation = addUSD(usd1, eur1);

ఈ ఉదాహరణలో, USD మరియు EUR అనేవి number రకంపై ఆధారపడిన బ్రాండెడ్ రకాలు. unique symbol ఈ రకాలు విభిన్నంగా ఉన్నాయని నిర్ధారిస్తుంది. createUSD మరియు createEUR ఫంక్షన్లు ఈ రకాల విలువలను సృష్టించడానికి ఉపయోగించబడతాయి, మరియు addUSD ఫంక్షన్ కేవలం USD విలువలను మాత్రమే అంగీకరిస్తుంది. ఒక EUR విలువను USD విలువకు జోడించడానికి ప్రయత్నిస్తే టైప్ ఎర్రర్ వస్తుంది.

స్ట్రింగ్ లిటరల్స్‌ను ఉపయోగించడం

మీరు బ్రాండింగ్ కోసం స్ట్రింగ్ లిటరల్స్‌ను కూడా ఉపయోగించవచ్చు, అయినప్పటికీ స్ట్రింగ్ లిటరల్స్ ప్రత్యేకంగా ఉంటాయని హామీ ఇవ్వబడనందున ఈ విధానం సింబల్స్‌ను ఉపయోగించడం కంటే తక్కువ పటిష్టమైనది.


type USD = number & { readonly __brand: 'USD' };
type EUR = number & { readonly __brand: 'EUR' };

function createUSD(value: number): USD {
  return value as USD;
}

function createEUR(value: number): EUR {
  return value as EUR;
}

function addUSD(a: USD, b: USD): USD {
  return (a + b) as USD;
}

const usd1 = createUSD(10);
const usd2 = createUSD(20);
const eur1 = createEUR(15);

const totalUSD = addUSD(usd1, usd2);
console.log("Total USD:", totalUSD);

// Uncommenting the next line will cause a type error
// const invalidOperation = addUSD(usd1, eur1);

ఈ ఉదాహరణ మునుపటి దానిలాగే అదే ఫలితాన్ని సాధిస్తుంది, కానీ సింబల్స్‌కు బదులుగా స్ట్రింగ్ లిటరల్స్‌ను ఉపయోగిస్తుంది. ఇది సరళంగా ఉన్నప్పటికీ, బ్రాండింగ్ కోసం ఉపయోగించే స్ట్రింగ్ లిటరల్స్ మీ కోడ్‌బేస్‌లో ప్రత్యేకంగా ఉండేలా చూసుకోవడం ముఖ్యం.

ఆచరణాత్మక ఉదాహరణలు మరియు వినియోగ సందర్భాలు

నిర్మాణాత్మక అనుకూలతకు మించి టైప్ సేఫ్టీని అమలు చేయవలసిన వివిధ దృశ్యాలకు బ్రాండెడ్ రకాలను అన్వయించవచ్చు.

IDలు

వివిధ రకాల IDలు ఉన్న ఒక సిస్టమ్‌ను పరిగణించండి, ఉదాహరణకు UserID, ProductID, మరియు OrderID. ఈ IDలన్నీ సంఖ్యలు లేదా స్ట్రింగ్స్‌గా సూచించబడవచ్చు, కానీ మీరు వివిధ ID రకాలను అనుకోకుండా కలపకుండా నిరోధించాలనుకుంటున్నారు.


const UserIDBrand = Symbol('UserID');
type UserID = string & { readonly [UserIDBrand]: unique symbol };

const ProductIDBrand = Symbol('ProductID');
type ProductID = string & { readonly [ProductIDBrand]: unique symbol };

function getUser(id: UserID): { name: string } {
  // ... fetch user data
  return { name: "Alice" };
}

function getProduct(id: ProductID): { name: string, price: number } {
  // ... fetch product data
  return { name: "Example Product", price: 25 };
}

function createUserID(id: string): UserID {
  return id as UserID;
}

function createProductID(id: string): ProductID {
  return id as ProductID;
}

const userID = createUserID('user123');
const productID = createProductID('product456');

const user = getUser(userID);
const product = getProduct(productID);

console.log("User:", user);
console.log("Product:", product);

// Uncommenting the next line will cause a type error
// const invalidCall = getUser(productID);

ఈ ఉదాహరణ UserIDని ఆశించే ఫంక్షన్‌కు ProductIDని పంపడాన్ని బ్రాండెడ్ రకాలు ఎలా నిరోధిస్తాయో ప్రదర్శిస్తుంది, ఇది టైప్ సేఫ్టీని మెరుగుపరుస్తుంది.

డొమైన్-నిర్దిష్ట విలువలు

నియంత్రణలతో డొమైన్-నిర్దిష్ట విలువలను సూచించడానికి కూడా బ్రాండెడ్ రకాలు ఉపయోగపడతాయి. ఉదాహరణకు, మీరు ఎల్లప్పుడూ 0 మరియు 100 మధ్య ఉండవలసిన శాతాల కోసం ఒక రకం కలిగి ఉండవచ్చు.


const PercentageBrand = Symbol('Percentage');
type Percentage = number & { readonly [PercentageBrand]: unique symbol };

function createPercentage(value: number): Percentage {
  if (value < 0 || value > 100) {
    throw new Error('Percentage must be between 0 and 100');
  }
  return value as Percentage;
}

function applyDiscount(price: number, discount: Percentage): number {
  return price * (1 - discount / 100);
}

try {
  const discount = createPercentage(20);
  const discountedPrice = applyDiscount(100, discount);
  console.log("Discounted Price:", discountedPrice);

  // Uncommenting the next line will cause an error during runtime
  // const invalidPercentage = createPercentage(120);
} catch (error) {
  console.error(error);
}

ఈ ఉదాహరణ రన్‌టైమ్‌లో బ్రాండెడ్ రకం యొక్క విలువపై నియంత్రణను ఎలా అమలు చేయాలో చూపిస్తుంది. టైప్ సిస్టమ్ ఒక Percentage విలువ ఎల్లప్పుడూ 0 మరియు 100 మధ్య ఉంటుందని హామీ ఇవ్వలేనప్పటికీ, createPercentage ఫంక్షన్ ఈ నియంత్రణను రన్‌టైమ్‌లో అమలు చేయగలదు. బ్రాండెడ్ రకాల రన్‌టైమ్ ధ్రువీకరణను అమలు చేయడానికి మీరు io-ts వంటి లైబ్రరీలను కూడా ఉపయోగించవచ్చు.

తేదీ మరియు సమయ ప్రాతినిధ్యాలు

వివిధ ఫార్మాట్‌లు మరియు టైమ్ జోన్‌ల కారణంగా తేదీలు మరియు సమయాలతో పనిచేయడం గమ్మత్తుగా ఉంటుంది. బ్రాండెడ్ రకాలు వివిధ తేదీ మరియు సమయ ప్రాతినిధ్యాల మధ్య తేడాను గుర్తించడంలో సహాయపడతాయి.


const UTCDateBrand = Symbol('UTCDate');
type UTCDate = string & { readonly [UTCDateBrand]: unique symbol };

const LocalDateBrand = Symbol('LocalDate');
type LocalDate = string & { readonly [LocalDateBrand]: unique symbol };

function createUTCDate(dateString: string): UTCDate {
  // Validate that the date string is in UTC format (e.g., ISO 8601 with Z)
  if (!/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(dateString)) {
    throw new Error('Invalid UTC date format');
  }
  return dateString as UTCDate;
}

function createLocalDate(dateString: string): LocalDate {
  // Validate that the date string is in local date format (e.g., YYYY-MM-DD)
  if (!/\d{4}-\d{2}-\d{2}/.test(dateString)) {
    throw new Error('Invalid local date format');
  }
  return dateString as LocalDate;
}

function convertUTCDateToLocalDate(utcDate: UTCDate): LocalDate {
  // Perform time zone conversion
  const date = new Date(utcDate);
  const localDateString = date.toLocaleDateString();
  return createLocalDate(localDateString);
}

try {
  const utcDate = createUTCDate('2024-01-20T10:00:00.000Z');
  const localDate = convertUTCDateToLocalDate(utcDate);
  console.log("UTC Date:", utcDate);
  console.log("Local Date:", localDate);
} catch (error) {
  console.error(error);
}

ఈ ఉదాహరణ UTC మరియు లోకల్ తేదీల మధ్య తేడాను చూపిస్తుంది, ఇది మీ అప్లికేషన్ యొక్క వివిధ భాగాలలో మీరు సరైన తేదీ మరియు సమయ ప్రాతినిధ్యంతో పనిచేస్తున్నారని నిర్ధారిస్తుంది. రన్‌టైమ్ ధ్రువీకరణ సరిగ్గా ఫార్మాట్ చేయబడిన తేదీ స్ట్రింగ్‌లు మాత్రమే ఈ రకాలను కేటాయించగలవని నిర్ధారిస్తుంది.

బ్రాండెడ్ రకాలను ఉపయోగించడానికి ఉత్తమ పద్ధతులు

టైప్‌స్క్రిప్ట్‌లో బ్రాండెడ్ రకాలను సమర్థవంతంగా ఉపయోగించడానికి, ఈ క్రింది ఉత్తమ పద్ధతులను పరిగణించండి:

బ్రాండెడ్ రకాల ప్రయోజనాలు

బ్రాండెడ్ రకాల ప్రతికూలతలు

బ్రాండెడ్ రకాలకు ప్రత్యామ్నాయాలు

టైప్‌స్క్రిప్ట్‌లో నామినల్ టైపింగ్‌ను సాధించడానికి బ్రాండెడ్ రకాలు ఒక శక్తివంతమైన సాంకేతికత అయినప్పటికీ, మీరు పరిగణించగల ప్రత్యామ్నాయ విధానాలు ఉన్నాయి.

అపారదర్శక రకాలు (Opaque Types)

అపారదర్శక రకాలు బ్రాండెడ్ రకాల మాదిరిగానే ఉంటాయి కానీ అంతర్లీన రకాన్ని దాచడానికి మరింత స్పష్టమైన మార్గాన్ని అందిస్తాయి. టైప్‌స్క్రిప్ట్‌లో అపారదర్శక రకాలకు అంతర్నిర్మిత మద్దతు లేదు, కానీ మీరు మాడ్యూల్స్ మరియు ప్రైవేట్ సింబల్స్‌ను ఉపయోగించి వాటిని అనుకరించవచ్చు.

క్లాసులు

క్లాసులను ఉపయోగించడం విభిన్న రకాలను నిర్వచించడానికి మరింత ఆబ్జెక్ట్-ఓరియెంటెడ్ విధానాన్ని అందించగలదు. టైప్‌స్క్రిప్ట్‌లో క్లాసులు నిర్మాణాత్మకంగా టైప్ చేయబడినప్పటికీ, అవి ఆందోళనల యొక్క స్పష్టమైన విభజనను అందిస్తాయి మరియు పద్ధతుల ద్వారా నియంత్రణలను అమలు చేయడానికి ఉపయోగించవచ్చు.

`io-ts` లేదా `zod` వంటి లైబ్రరీలు

ఈ లైబ్రరీలు అధునాతన రన్‌టైమ్ టైప్ ధ్రువీకరణను అందిస్తాయి మరియు కంపైల్-టైమ్ మరియు రన్‌టైమ్ భద్రత రెండింటినీ నిర్ధారించడానికి బ్రాండెడ్ రకాలతో కలపవచ్చు.

ముగింపు

టైప్‌స్క్రిప్ట్ బ్రాండెడ్ రకాలు ఒక స్ట్రక్చరల్ టైప్ సిస్టమ్‌లో టైప్ సేఫ్టీ మరియు కోడ్ స్పష్టతను మెరుగుపరచడానికి ఒక విలువైన సాధనం. ఒక రకానికి "బ్రాండ్" జోడించడం ద్వారా, మీరు నామినల్ టైపింగ్‌ను అమలు చేయవచ్చు మరియు నిర్మాణాత్మకంగా సారూప్యంగా ఉన్నప్పటికీ లాజికల్‌గా భిన్నమైన రకాలను అనుకోకుండా కలపడాన్ని నివారించవచ్చు. బ్రాండెడ్ రకాలు కొంత సంక్లిష్టత మరియు ఓవర్‌హెడ్‌ను పరిచయం చేసినప్పటికీ, మెరుగైన టైప్ సేఫ్టీ మరియు కోడ్ నిర్వహణ యొక్క ప్రయోజనాలు తరచుగా ప్రతికూలతలను అధిగమిస్తాయి. మీరు ఒక విలువ దాని నిర్మాణంతో సంబంధం లేకుండా ఒక నిర్దిష్ట రకానికి చెందినదని నిర్ధారించుకోవలసిన దృశ్యాలలో బ్రాండెడ్ రకాలను ఉపయోగించడాన్ని పరిగణించండి.

స్ట్రక్చరల్ మరియు నామినల్ టైపింగ్ వెనుక ఉన్న సూత్రాలను అర్థం చేసుకోవడం ద్వారా మరియు ఈ ఆర్టికల్‌లో వివరించిన ఉత్తమ పద్ధతులను అన్వయించడం ద్వారా, మీరు మరింత పటిష్టమైన మరియు నిర్వహించదగిన టైప్‌స్క్రిప్ట్ కోడ్‌ను వ్రాయడానికి బ్రాండెడ్ రకాలను సమర్థవంతంగా ఉపయోగించుకోవచ్చు. కరెన్సీలు మరియు IDలను సూచించడం నుండి డొమైన్-నిర్దిష్ట నియంత్రణలను అమలు చేయడం వరకు, బ్రాండెడ్ రకాలు మీ ప్రాజెక్ట్‌లలో టైప్ సేఫ్టీని మెరుగుపరచడానికి ఒక సౌకర్యవంతమైన మరియు శక్తివంతమైన యంత్రాంగాన్ని అందిస్తాయి.

మీరు టైప్‌స్క్రిప్ట్‌తో పనిచేస్తున్నప్పుడు, టైప్ ధ్రువీకరణ మరియు అమలు కోసం అందుబాటులో ఉన్న వివిధ సాంకేతికతలు మరియు లైబ్రరీలను అన్వేషించండి. టైప్ సేఫ్టీకి సమగ్ర విధానాన్ని సాధించడానికి io-ts లేదా zod వంటి రన్‌టైమ్ ధ్రువీకరణ లైబ్రరీలతో కలిపి బ్రాండెడ్ రకాలను ఉపయోగించడాన్ని పరిగణించండి.